package cn.biplam.back.sql.type;

import java.io.Serializable;

import cn.biplam.common.wrapper.ErrorMessage;

/**
 * Char数据元
 * @author 	WangSong
 * @create 	Mar 11, 2009 11:02:46 AM
 * @version 1.0
 */
public class Char implements Type,Serializable {

	/**Char数据元最大长度*/
	private static final int CHAR_MAX_LENGTH=255;
	private static final long serialVersionUID = 5907771835450643997L;
	private static final String sTypeName="CHAR";


	private boolean bIsNull=true;
	private int iLength=1;
	private String sValue;

	/**
	 * 构造方法 创建一个空值(isNull=true)的Char数据元,长度=1
	 */
	public Char(){}

	/**
	 * 构造方法 创建一个指定长度的空值(isNull=true)的Char数据元
	 * @param length 长度
	 * @throws ErrorMessage 
	 */
	public Char(int length) throws ErrorMessage{
		this.setLength(length);
	}

	/**
	 * 构造方法
	 * @param iLength	长度
	 * @param iValue	int型初始值
	 * @throws ErrorMessage 
	 */
	public Char(int iLength,int iValue) throws ErrorMessage{
		this.setLength(iLength);
		this.setValue(iValue);
	}

	/**
	 * 构造方法
	 * @param length	长度
	 * @param iValue	Integer型初始值
	 * @throws ErrorMessage
	 */
	public Char(int length,Integer iValue) throws ErrorMessage{
		this.setLength(length);
		this.setValue(iValue);
	}

	/**
	 * 构造方法
	 * @param length 长度
	 * @param sValue 字符串(不能为null)
	 * @throws ErrorMessage
	 */
	public Char(int length,String sValue) throws ErrorMessage{
		this.setLength(length);
		this.setValue(sValue);
	}

	/**
	 * 返回数据元的数据类型的完整描述
	 * @return
	 */
	public String getType(){
		StringBuilder sb=new StringBuilder();
		sb.append(sTypeName);
		sb.append("(");
		sb.append(this.iLength);
		sb.append(")");
		return sb.toString();
	}

	/**
	 * 返回数据元数据类型的关键字
	 * @return
	 */
	@SuppressWarnings("static-access")
	public String getTypeName() {
		return this.sTypeName;
	}

	/**
	 * 获得数据元的值，其内容必须经过初始化/设置(允许空格)
	 * @see isNull()
	 * @return
	 * @throws ErrorMessage
	 */
	public String getValue() throws ErrorMessage {
		if(this.bIsNull){
			ErrorMessage eMsg=new ErrorMessage("Char type is empty!");
			throw eMsg;
		}else{
			return this.sValue;
		}
	}

	/**
	 * 查询数据元内容是否为空
	 * @return
	 */
	public boolean isNull(){
		return bIsNull;
	}

	/**
	 * 返回数据元的长度
	 * @return
	 */
	public int getPercesion(){
		return iLength;
	}

	/**
	 * 设置数据元的长度
	 * 			设置并检查Char类型长度是否符合规范
	 * @param length
	 * @return
	 * @throws ErrorMessage
	 */
	public void setLength(int length) throws ErrorMessage {

		ErrorMessage eMsg=null;

		if(iLength>CHAR_MAX_LENGTH){
			StringBuilder sb = new StringBuilder();
			sb.append("Char type length(");
			sb.append(length);
			sb.append(") is too long!");
			eMsg=new ErrorMessage(sb.toString());
			throw eMsg;
		}else if(iLength<1){
			StringBuilder sb = new StringBuilder();
			sb.append("Char type length(");
			sb.append("length");
			sb.append(") error!");
			eMsg=new ErrorMessage(sb.toString());
		}

		if(eMsg==null){
			this.iLength=length;
		}else{
			throw eMsg;
		}
	}

	/**
	 * 设置Char数据元的值
	 * @param value 任意数字
	 * @throws ErrorMessage 
	 */
	public void setValue(int value) throws ErrorMessage {
		String s=Integer.toString(value);
		ErrorMessage eMsg;
		if(s.length()>this.iLength){
			StringBuilder sb = new StringBuilder();
			sb.append("String: ");
			sb.append(value);
			sb.append(" length is to long into char(");
			sb.append(this.iLength);
			sb.append(")!");
			eMsg=new ErrorMessage(sb.toString());
			throw eMsg;
		}else{
			this.sValue=s;
			this.bIsNull=false;
		}
	}

	/**
	 * 设置数据元的值(不允许传入null)
	 * @param sValue 字符串
	 * @throws ErrorMessage
	 */
	public void setValue(String sValue) throws ErrorMessage{
		if(sValue==null){
			ErrorMessage eMsg =new ErrorMessage("The String parameter is null!");
			throw eMsg;
		}else{
			this.sValue=sValue;
			this.bIsNull=false;
		}
	}

	/**
	 * 返回SQL语法表示的数据内容的字符串，如果内容为空，则返回null
	 * @return
	 */
	public String toString() {
		if(this.sValue==null){
			return "null";
		}else{
			StringBuilder sb=new StringBuilder();
			sb.append("'");
			sb.append(this.sValue);
			sb.append("'");
			return sb.toString();
		}
	}

	/**
	 * 数据元无精度，默认-1
	 * @return
	 */
	public int getScale() {
		return -1;
	}

}
